home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 026-050 / 042 / mg1a / main.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  6KB  |  286 lines

  1. /*
  2.  *        Mainline, macro commands.
  3.  */
  4. #include    "def.h"
  5.  
  6. int    thisflag;            /* Flags, this command        */
  7. int    lastflag;            /* Flags, last command        */
  8. int    curgoal;            /* Goal column            */
  9. BUFFER    *curbp;                /* Current buffer        */
  10. WINDOW    *curwp;                /* Current window        */
  11. BUFFER    *bheadp;            /* BUFFER listhead        */
  12. WINDOW    *wheadp = (WINDOW *)NULL;    /* WINDOW listhead        */
  13. KEY    kbdm[NKBDM] = {(KCTLX|')')};    /* Macro            */
  14. KEY    *kbdmip;            /* Input  for above        */
  15. KEY    *kbdmop;            /* Output for above        */
  16. char    pat[NPAT];            /* Pattern            */
  17. #ifdef    HASH
  18. SYMBOL    *symbol[NSHASH];        /* Symbol table listhead.    */
  19. #else
  20. /* should really be a *symbol, but don't want to break the hash code yet */
  21. SYMBOL    *symbol[1];
  22. #endif
  23. SYMBOL    *binding[NKEYS];        /* Key bindings.        */
  24. #ifdef    DPROMPT
  25. extern char prompt[], *promptp;        /* delayed prompting        */
  26. #endif
  27.  
  28. main(argc, argv) char *argv[]; {
  29.     register KEY    c;
  30.     register int    f;
  31.     register int    n;
  32.     register int    mflag;
  33. #ifdef    STARTUP
  34.     char        *sfile, *startupfile();
  35. #endif
  36.     char        bname[NBUFN];
  37.  
  38. #ifdef SYSINIT
  39.     SYSINIT;                /* system dependent.    */
  40. #endif
  41.     vtinit();                /* Virtual terminal.    */
  42.     edinit();                /* Buffers, windows.    */
  43.     keymapinit();                /* Symbols, bindings.    */
  44.     /* doing update() before reading files causes the error messages from
  45.      * the file I/O show up on the screen.  (and also an extra display
  46.      * of the mode line if there are files specified on the command line.)
  47.      */
  48.     update();
  49. #ifdef    STARTUP                    /* User startup file.    */
  50.     if ((sfile = startupfile()) != NULL)
  51.         (VOID) load(sfile);
  52. #endif
  53.     while (--argc > 0) {
  54.         makename(bname, *++argv);
  55.         curbp = bfind(bname, TRUE);
  56.         (VOID) showbuffer(curbp, curwp, 0);
  57.         (VOID) readin(*argv);
  58.     }
  59.     lastflag = 0;                /* Fake last flags.    */
  60. loop:
  61. #ifdef    DPROMPT
  62.     *(promptp = prompt) = '\0';
  63.     if(epresf == KPROMPT) eerase();
  64. #endif
  65.     update();                /* Fix up the screen.    */
  66.     c = getkey(KPROMPT);
  67.     if (epresf == TRUE) {
  68.         eerase();
  69.         update();
  70.     }
  71.     f = FALSE;
  72.     n = 1;
  73.     if (((KMETA|'0') <= c && c <= (KMETA|'9')) || c == (KMETA|'-')) {
  74.         f = TRUE;
  75.         c = c & ~KMETA;
  76.     } else if (c == (KCTRL|'U')) {
  77.         f = TRUE;
  78.         n = 4;
  79.         while ((c=getkey(KNOMAC | KPROMPT)) == (KCTRL|'U')) 
  80.             n *= 4;
  81.     }
  82.     if (f == TRUE) {
  83.         if ((c>='0' && c<='9') || c=='-') {
  84.             if (c == '-') {
  85.                 n = 0;
  86.                 mflag = TRUE;
  87.             } else {
  88.                 n = ((int) c) - '0';
  89.                 mflag = FALSE;
  90.             }
  91.             while ((c=getkey(KNOMAC | KPROMPT))>='0' && c<='9')
  92.                 n = 10*n + ((int) c) - '0';
  93.             if (mflag != FALSE)
  94.                 n = -n;
  95.         }
  96.     }
  97.     if (kbdmip != NULL) {            /* Terminate macros.    */
  98.         if (c!=(KCTLX|')') && kbdmip>&kbdm[NKBDM-6]) {
  99.             (VOID) ctrlg(FALSE, 0, KRANDOM);
  100.             goto loop;
  101.         }
  102.         if (f != FALSE) {
  103.             kbdmip[-1] = (KEY) (KCTRL|'U');/* overwrite ESC */
  104.             *kbdmip++ = (KEY) n;
  105.             *kbdmip++ = (KEY) c;
  106.         }
  107.     }
  108.     switch (execute(c, f, n)) {        /* Do it.        */
  109.         case TRUE: break;
  110.         case ABORT:
  111.                ewprintf("Quit");    /* and fall through */
  112.         case FALSE: default:
  113.                ttbeep();
  114.                if (kbdmip != NULL) {
  115.                    kbdm[0] = (KEY) (KCTLX|')');
  116.                    kbdmip = NULL;
  117.                }
  118.     }
  119.     goto loop;
  120. }
  121.  
  122. /*
  123.  * Command execution. Look up the binding in the the
  124.  * binding array, and do what it says. Return a very bad status
  125.  * if there is no binding, or if the symbol has a type that
  126.  * is not usable (there is no way to get this into a symbol table
  127.  * entry now). Also fiddle with the flags.
  128.  */
  129. execute(c, f, n) KEY c; {
  130.     register SYMBOL    *sp;
  131.     register int    status;
  132.  
  133.     if ((sp=binding[c]) != NULL) {
  134.         thisflag = 0;
  135.         status = (*sp->s_funcp)(f, n, c);
  136.         lastflag = thisflag;
  137.         return (status);
  138.     }
  139.     lastflag = 0;
  140.     return (FALSE);
  141. }
  142.  
  143. /*
  144.  * Initialize all of the buffers
  145.  * and windows. The buffer name is passed down as
  146.  * an argument, because the main routine may have been
  147.  * told to read in a file by default, and we want the
  148.  * buffer name to be right.
  149.  */
  150. edinit() {
  151.     register BUFFER    *bp;
  152.     register WINDOW    *wp;
  153.  
  154.     bheadp = NULL;
  155.     bp = bfind("*scratch*", TRUE);        /* Text buffer.        */
  156.     wp = (WINDOW *)malloc(sizeof(WINDOW));    /* Initial window.    */
  157.     if (bp==NULL || wp==NULL) panic("edinit");
  158.     curbp  = bp;                /* Current ones.    */
  159.     wheadp = wp;
  160.     curwp  = wp;
  161.     wp->w_wndp  = NULL;            /* Initialize window.    */
  162.     wp->w_bufp  = bp;
  163.     bp->b_nwnd  = 1;            /* Displayed.        */
  164.     wp->w_linep = bp->b_linep;
  165.     wp->w_dotp  = bp->b_linep;
  166.     wp->w_doto  = 0;
  167.     wp->w_markp = NULL;
  168.     wp->w_marko = 0;
  169.     wp->w_toprow = 0;
  170.     wp->w_ntrows = nrow-2;            /* 2 = mode, echo.    */
  171.     wp->w_force = 0;
  172.     wp->w_flag  = WFMODE|WFHARD;        /* Full.        */
  173. }
  174.  
  175. /*
  176.  * Quit command. If an argument, always
  177.  * quit. Otherwise confirm if a buffer has been
  178.  * changed and not written out. Normally bound
  179.  * to "C-X C-C".
  180.  */
  181. /*ARGSUSED*/
  182. quit(f, n, k) {
  183.     register int    s;
  184.  
  185.     if ((s = anycb(FALSE)) == ABORT) return ABORT;
  186.     if (s == FALSE
  187.     || eyesno("Some modified buffers exist, really exit") == TRUE) {
  188.         vttidy();
  189.         exit(GOOD);
  190.     }
  191.     return TRUE;
  192. }
  193.  
  194. /*
  195.  * Begin a keyboard macro.
  196.  * Error if not at the top level
  197.  * in keyboard processing. Set up
  198.  * variables and return.
  199.  */
  200. /*ARGSUSED*/
  201. ctlxlp(f, n, k) {
  202.     if (kbdmip!=NULL || kbdmop!=NULL) {
  203.         ewprintf("Already defining kbd macro!");
  204.         return (FALSE);
  205.     }
  206.     ewprintf("Defining kbd macro...");
  207.     kbdmip = &kbdm[0];
  208.     return (TRUE);
  209. }
  210.  
  211. /*
  212.  * End keyboard macro. Check for
  213.  * the same limit conditions as the
  214.  * above routine. Set up the variables
  215.  * and return to the caller.
  216.  */
  217. /*ARGSUSED*/
  218. ctlxrp(f, n, k) {
  219.     if (kbdmip == NULL) {
  220.         ewprintf("Not defining kbd macro.");
  221.         return (FALSE);
  222.     }
  223.     ewprintf("Keyboard macro defined");
  224.     kbdmip = NULL;
  225.     return (TRUE);
  226. }
  227.  
  228. /*
  229.  * Execute a macro.
  230.  * The command argument is the
  231.  * number of times to loop. Quit as
  232.  * soon as a command gets an error.
  233.  * Return TRUE if all ok, else
  234.  * FALSE.
  235.  */
  236. /*ARGSUSED*/
  237. ctlxe(f, n, k) {
  238.     register KEY    c;
  239.     register int    af;
  240.     register int    an;
  241.     register int    s;
  242.  
  243.     if (kbdmip!=NULL || kbdmop!=NULL) {
  244.         ewprintf("Not now");
  245.         return (FALSE);
  246.     }
  247.     if (n < 0) 
  248.         return (TRUE);
  249.     do {
  250.         kbdmop = &kbdm[0];
  251.         do {
  252.             af = FALSE;
  253.             an = 1;
  254.             if ((c = *kbdmop++) == (KCTRL|'U')) {
  255.                 af = TRUE;
  256.                 an = (int) *kbdmop++;
  257.                 c  = *kbdmop++;
  258.             }
  259.             s = TRUE;
  260.         } while (c!=(KCTLX|')') && (s=execute(c, af, an))==TRUE);
  261.         kbdmop = NULL;
  262.     } while (s==TRUE && --n);
  263.     return (s);
  264. }
  265.  
  266. /*
  267.  * User abort. Should be called by any input routine that sees a C-g
  268.  * to abort whatever C-g is aborting these days. Currently does
  269.  * nothing.
  270.  */
  271. /*ARGSUSED*/
  272. ctrlg(f, n, k) {
  273.     return (ABORT);
  274. }
  275.  
  276. /*
  277.  * Display the version. All this does
  278.  * is copy the version string onto the echo line.
  279.  */
  280. /*ARGSUSED*/
  281. showversion(f, n, k) {
  282.  
  283.     ewprintf(version);
  284.     return TRUE ;
  285. }
  286.